<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes"/>
<title>3.4 流水线处理器设计 | pansis.io</title>
<link rel="shortcut icon" href="https://github.pansis.site/favicon.ico">
<link href="https://github.pansis.site/styles/main.css" rel="stylesheet">
<link href="//at.alicdn.com/t/c/font_1678829_b85ccgkdqkr.css" rel="stylesheet">
<link href="//cdnjs.cloudflare.com/ajax/libs/KaTeX/0.10.0/katex.min.css" rel="stylesheet">
<link rel="alternate" type="application/rss+xml" title="pansis.io » Feed" href="https://github.pansis.site/atom.xml">
        <meta name="description" content="一、流水线原理
1、单周期数据通路（5部分）
1、单周期数据通路

2、指令执行步骤

取指（IF）：根据PC从指令存储器（IM）中读取指令
译码与读寄存器（ID）：完成指令译码，并读取寄存器堆
执行运算（EX）：R/I型指令--完成数据运..." />
        <meta name="keywords" content="计算机组成原理" />
        <!-- OG -->
        <meta property="og:locale" content="zh_CN">
        <meta property="og:title" content="3.4 流水线处理器设计" />
        <meta property="og:type" content="article" />
        <meta property="og:description" content="一、流水线原理
1、单周期数据通路（5部分）
1、单周期数据通路

2、指令执行步骤

取指（IF）：根据PC从指令存储器（IM）中读取指令
译码与读寄存器（ID）：完成指令译码，并读取寄存器堆
执行运算（EX）：R/I型指令--完成数据运...">
        <meta property="og:url" content="https://github.pansis.site/post/3.4 流水线处理器设计/" />
        <meta property="og:site_name" content="pansis.io">
        <meta property="og:updated_time" content="2024-05-10">
        <meta property="og:image" content="" />
        <meta property="og:image:secure_url" content="">
        <meta property="og:image:alt" content="3.4 流水线处理器设计">
        <!-- Twitter (post.ejs) -->
        <meta name="twitter:card" content="summary_large_image">
        <meta name="twitter:title" content="3.4 流水线处理器设计">
        <meta name="twitter:description" content="一、流水线原理
1、单周期数据通路（5部分）
1、单周期数据通路

2、指令执行步骤

取指（IF）：根据PC从指令存储器（IM）中读取指令
译码与读寄存器（ID）：完成指令译码，并读取寄存器堆
执行运算（EX）：R/I型指令--完成数据运...">
        <!-- <meta name="twitter:site" content="@WBoy0609">
        <meta name="twitter:creator" content="@WBoy0609"> -->
        <meta name="twitter:image" content="">
</head>

<body>
    <div class="main animated">
        <div class="header animated fadeInDown">
    <div class="site_title_container">
        <div class="site_title">
            <a href="https://github.pansis.site">pansis.io</a>
        </div>
    </div>
    <div class="my_socials">
        
            
        
            
        
            
        
            
        
            
        
            
        
            
        
        <a href="https://github.pansis.site/atom.xml" title="rss" target="_blank"><i class="iconfont icon-rss"></i></a>
    </div>
</div>

    <div class="header_menu">
        
            
                <a href="/" class="menu">首页</a>
            
        
            
                <a href="/tag/GWAaV2nvk/" class="menu">程序设计课程</a>
            
        
            
                <a href="/tag/24hangc" class="menu">比赛</a>
            
        
            
                <a href="/tag/L7r9STb75/" class="menu">Python教程</a>
            
        
            
                <a href="/tags" class="menu">分类</a>
            
        
        <div class="gridea-search-div">
            <form id="gridea-search-form" action="https://github.pansis.site/search/">
                <input class="gridea-search-input" autocomplete="off" spellcheck="false" name="q"/>
            </form>
        </div>
    </div>

            <div class="autopagerize_page_element">
                <div class="content">
                    <div class="post_page">
                        <div class="post animated fadeInDown">
                            <div class="post_title post_detail_title">
                                <h2>
                                    3.4 流水线处理器设计
                                </h2>
                                <span class="article-info">
                                    2024-05-10, 1729 words, 7 min read
                                </span>
                            </div>
                            <div class="post_content markdown">
                                <p class="md_block">
                                    <span class="md_line md_line_start md_line_end">
                                        <h2 id="一-流水线原理">一、流水线原理</h2>
<h4 id="1-单周期数据通路5部分">1、单周期数据通路（5部分）</h4>
<p>1、单周期数据通路</p>
<img src="http://cos.pansis.site/202405070956234.png/abc123" alt="image-20240507095619110" style="zoom:70%;" />
<p>2、指令执行步骤</p>
<ul>
<li>取指（IF）：根据PC从指令存储器（IM）中读取指令</li>
<li>译码与读寄存器（ID）：完成指令译码，并读取寄存器堆</li>
<li>执行运算（EX）：R/I型指令--完成数据运算或地址运算</li>
<li>访存/分支转移（MEM）：访存指令（lw/sw）--访问数据存储器   beq指令：完成分支转移（修改PC）</li>
<li>写寄存器（WB）：R型指令，I型运算指令--运算结果写寄存器    lw指令--存储器操作数写寄存器</li>
</ul>
<h4 id="2-流水线指令时间">2、流水线指令时间</h4>
<p>（假设单个步骤需要200ps）</p>
<p>1、单周期模型每个指令消耗800ps  ？？？？？？？？？？</p>
<p>2、流水线模型</p>
<ul>
<li>时钟周期：200ps（取决于最长步骤所花时间）</li>
<li>单个指令执行分为5步，共1000ps</li>
<li>N条指令执行时间：（1000+(N-1)×200) ps</li>
</ul>
<h4 id="3-流水线特点">3、流水线特点</h4>
<ul>
<li>流水线不改善单个任务处理延迟，但改善了整体工作负载的吞吐率</li>
<li>流水线速率受限于最慢的流水段</li>
<li>多个任务同时工作，但占用不同的资源</li>
<li>潜在加速比 = 流水线级数</li>
</ul>
<h2 id="二-流水线数据通路">二、流水线数据通路</h2>
<h4 id="1-总体考虑">1、总体考虑</h4>
<p>1、流水线数据通路分为5个流水段</p>
<p>2、流水线寄存器：每一个流水段执行所需要的数据均来自前一个状态单元的输出，本段执行结束后将数据写入自己的状态单元，供下一流水段使用。</p>
<h4 id="2-数据通路">2、数据通路</h4>
<figure data-type="image" tabindex="1"><img src="http://cos.pansis.site/202405071019559.png/abc123" alt="image-20240507101932469" loading="lazy"></figure>
<img src="http://cos.pansis.site/202405071030003.png/abc123" alt="image-20240507103022927" style="zoom:67%;" />
<h4 id="3-流水线寄存器">3、流水线寄存器</h4>
<p>1、命名规则：前级/后级   IF/ID(在取指和指令译码之间的寄存器)</p>
<p>2、功能：</p>
<ul>
<li>时钟上升沿到来时，保存前级结果</li>
<li>输出至下级组合逻辑，也可能直接连接到下级流水线寄存器</li>
</ul>
<p>3、N级流水线有N级流水线寄存器</p>
<ul>
<li>N-1级流水线寄存器，最后一级为Register File（RF写端口）</li>
</ul>
<p>4、RF寄存器堆在流水线通路中使用两次（第2级读，第5级写）</p>
<p>5、PC在每个时钟上沿都会被更新</p>
<h4 id="4-流水阶段的处理">4、流水阶段的处理</h4>
<p>1、组合逻辑+流水线寄存器</p>
<ol>
<li>起始：前级流水线寄存器的输出</li>
<li>中间：组合逻辑</li>
<li>结束：写入后级流水线寄存器，当时钟上升沿到来时，组合逻辑计算结果存入后级寄存器</li>
</ol>
<p>2、示例</p>
<img src="http://cos.pansis.site/202405071041991.png/abc123" alt="image-20240507104107943" style="zoom:67%;" />
<ul>
<li>起始：ID/EX流水线寄存器中的R1D@ID/EX和R2D@ID/EX的输出</li>
<li>中间(组合逻辑)：ALU完成R1D和R2D的运算（组合逻辑）</li>
<li>结束(寄存器)：在clock上升沿到来时，结果写入EX/MEM中的AOE@EX/MEM</li>
</ul>
<h4 id="5-控制信号">5、控制信号</h4>
<ul>
<li>译码产生指令执行所有控制信号，与单周期完全相同；</li>
<li>每个控制信号只在所需要的流水段发生作用，这一点与单周期不同</li>
<li>控制信号流水寄存器：控制信号在寄存器中传递，直至不再需要</li>
</ul>
<img src="http://cos.pansis.site/202405071046910.png/abc123" alt="image-20240507104648829" style="zoom:70%;" />
<h2 id="三-流水线冒险">三、流水线冒险</h2>
<h4 id="1-流水线冒险">1、流水线冒险</h4>
<p>1、定义：流水线相近指令出现某些关联，下一个时钟周期不能执行下一条指令，指令流水线必须出现停顿。</p>
<p>2、种类</p>
<ul>
<li>结构冒险
<ul>
<li>硬件不支持多条指令在同一个时钟周期执行。</li>
<li>若系统只有一个存储器部件，就会带来结构冒险问题。</li>
</ul>
</li>
<li>数据冒险
<ul>
<li>指令执行所需的数据暂时不可用而造成的指令执行的停顿。</li>
<li>数据冒险一般发生在相近指令共用一个存储单元或同一寄存器时。</li>
</ul>
</li>
<li>控制冒险/分支冒险
<ul>
<li>必须根据前一条指令的执行结果才能确定下一条真正要执行的指令，此时流水线中取得的可能不是真正要执行的指令。</li>
</ul>
</li>
</ul>
<h4 id="3-结构冒险">3、结构冒险</h4>
<p>1、寄存器堆在结构上支持读操作与写操作同时进行，不存在结构冒险</p>
<p>2、针对存储器的结构冒险，采取指令存储器和数据存储器分离</p>
<h4 id="4-数据冒险">4、数据冒险</h4>
<p>略，见下</p>
<h4 id="5-控制冒险">5、控制冒险</h4>
<p>1、控制冒险主要由条件转移指令引起，前面指令执行的结果可能会使程序执行发生转移，流水线中提前取来的指令可能不应该被执行。</p>
<p>2、方法：停顿、假定分支不会发生、缩短分支延迟、分支延迟槽技术</p>
<p>3、停顿：遇到分支指令，在IF/ID插入3个nop</p>
<figure data-type="image" tabindex="2"><img src="http://cos.pansis.site/202405071106327.png/abc123" alt="image-20240507110648259" loading="lazy"></figure>
<p>4、假定分支不会发生</p>
<p>若分支发生的处理：后继3条指令已经进入流水线，必须清除这3条后继指令</p>
<p>5、缩短分支延迟</p>
<ul>
<li>在ID级增加比较器，尽快得到beq指令结果</li>
<li>beq指令后继可能被废弃的指令减少为1条，当需要转移时，清除IF/ID即可</li>
<li>比较器前置，会产生数据冒险问题
<ul>
<li>
<img src="http://cos.pansis.site/202405071111567.png/abc123" alt="image-20240507111116506" style="zoom:67%;" />
</li>
</ul>
</li>
</ul>
<img src="http://cos.pansis.site/202405071111839.png/abc123" alt="image-20240507111143759" style="zoom:70%;" />
<p>6、延迟槽技术</p>
<ul>
<li>缩短分支延迟依旧存在废弃一条指令的可能，延迟槽可以避免这种情况。</li>
<li>分支延迟槽定义：在体系结构层面规定分支指令后面的一个时间片为分支延迟槽</li>
<li>用不影响分支的一条指令填充到该时间片中，位于延迟槽中的指令总是被执行，与分支发生与否没有关系。这样就有效利用了一个时间片，消除了流水线的一个气泡</li>
</ul>
<img src="http://cos.pansis.site/202405071117741.png/abc123" alt="image-20240507111702672" style="zoom:50%;" />
<img src="http://cos.pansis.site/202405071117597.png/abc123" alt="image-20240507111714541" style="zoom:50%;" />
<h2 id="四-数据冒险">四、数据冒险</h2>
<h4 id="1-处理方法">1、处理方法</h4>
<p>旁路转发</p>
<h4 id="2-旁路转发">2、旁路转发</h4>
<p>1、场景一</p>
<img src="http://cos.pansis.site/202405071118681.png/abc123" alt="image-20240507111859608" style="zoom:70%;" />
<p>2、场景二  load指令Rt（写），隔条指令Rs或Rt（读）</p>
<img src="http://cos.pansis.site/202405071119952.png/abc123" alt="image-20240507111940888" style="zoom:50%;" />
<p>3、场景三 同一时钟写和读同一个寄存器</p>
<img src="http://cos.pansis.site/202405071127371.png/abc123" alt="image-20240507112741299" style="zoom:50%;" />
<p>改造方法：在一个周期内实现先写后读</p>
<img src="http://cos.pansis.site/202405071130949.png/abc123" alt="image-20240507113013891" style="zoom:50%;" />
<p>4、场景四 load导致的数据冒险</p>
<p>load必须在MEM阶段才可以获取所需要的数据</p>
<img src="http://cos.pansis.site/202405071146810.png/abc123" alt="image-20240507114629749" style="zoom:70%;" />
<img src="http://cos.pansis.site/202405071149067.png/abc123" alt="image-20240507114943983" style="zoom:67%;" />
<p>5、如何插入NOP</p>
<ul>
<li>
<p>检测条件：IF/ID的前序是lw指令，并且lw的rt寄存器与IF/ID的rs或rt相同</p>
</li>
<li>
<p>执行动作：</p>
<ul>
<li>冻结IF/ID：sub继续被保存</li>
<li>清除ID/EX：全为0，等价于插入NOP（怎么理解？）</li>
<li>禁止PC：防止PC继续计数，PC应保持为8</li>
</ul>
</li>
<li>
<p>冻结IF/ID：增加IF/ID.en控制信号，当IF/ID.en无效时，IF/ID在下个clock上升沿到来时保持不变</p>
</li>
<li>
<p>清除ID/EX：增加ID/EX.clr控制信号，当ID/EX.clr有效时，ID/EX在下个clock上升沿到来时被清除为0</p>
</li>
<li>
<p>禁止PC：增加PC.en控制信号，当PC.en为无效时，PC在下个clock上升沿到来时保持不变</p>
</li>
<li>
<p>逻辑关系</p>
<img src="http://cos.pansis.site/202405071158552.png/abc123" alt="image-20240507115821502" style="zoom:67%;" />
</li>
<li>
<p>若没有数据转发，则EX/MEM，MEM/WB也均需要做冲突分析及NOP处理</p>
</li>
</ul>
<p>3、改造后的数据通路</p>
<img src="http://cos.pansis.site/202405071131881.png/abc123" alt="image-20240507113155819" style="zoom:67%;" />
<p>旁路转发检测与控制</p>
<img src="http://cos.pansis.site/202405071133907.png/abc123" alt="image-20240507113301842" style="zoom:67%;" /><br />
                                            
                                </p>
                            </div>
                            <div class="post_footer">
                                
                                    <div class="meta">
                                        <div class="info"><span class="field tags"><i class="iconfont icon-tag-sm"></i>
                                                
                                                    <a href="https://github.pansis.site/tag/jsjzcyl/" class="article-info">
                                                        计算机组成原理
                                                    </a>
                                                    
                                            </span>
                                        </div>
                                    </div>
                                    
                                        
                            </div>
                        </div>
                        
                            
                                <link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css">
<script src="https://unpkg.com/gitalk/dist/gitalk.min.js"></script>
<div id="gitalk-container" style="padding-bottom: 20px;"></div>
<script>
    var pageId = (location.pathname).substring(1, 49) // Ensure uniqueness and length less than 50
    pageId = pageId.endsWith('/') ? pageId.slice(0, -1) : pageId // 以斜杠结尾则去除
    var gitalk = new Gitalk({
        clientID: '9d5eba33618472c44a07',
        clientSecret: '065a85ed04333ceebfc4f01d7ca1674175730339',
        repo: 'fzxl2003.github.io',
        owner: 'fzxl2003',
        admin: ['fzxl2003'],
        id: pageId,
        distractionFreeMode: false  // Facebook-like distraction free mode
    })
    gitalk.render('gitalk-container')
</script>
                                    
                                        
                                                    
                    </div>
                </div>
            </div>
    </div>
    <div class="footer">
    
    <div class="powered_by">
        <a href="https://codeberg.org/kytrun/gridea-theme-one" target="_blank">Theme One,</a>
        <a href="https://open.gridea.dev/" target="_blank">Powered by Gridea&#65281;</a>
    </div>
    
    
        <div class="footer_slogan">
            Powered by <a href="https://github.com/getgridea/gridea" target="_blank">Gridea</a>
        </div>
    
    <div id="back_to_top" class="back_to_top">
        <span>△</span>
    </div>
    
</div>

<script src="https://github.pansis.site/media/scripts/util.js"></script>
        <link rel="stylesheet" href="//unpkg.com/@highlightjs/cdn-assets@11.5.1/styles/default.min.css">
        <script src="//unpkg.com/@highlightjs/cdn-assets@11.5.1/highlight.min.js"></script>
        <script>hljs.highlightAll();</script>
</body>

</html>